package com.zhoug.json2;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import java.io.Reader;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * Gson 序列化工具封装
 * @Author: zhoug
 * @Date: 2024-12-10
 * @Description:
 */
public class GsonUtils {
    private final Gson mGson;


    public static GsonUtils with(Gson gson) {
        return new GsonUtils(gson);
    }

    public static GsonUtils getDefault() {
        return new GsonUtils(null);
    }

    protected GsonUtils(Gson gson) {
        if (gson == null) {
            this.mGson = creatGson();
        } else {
            this.mGson = gson;
        }
    }

    private static Gson creatGson() {
        Gson gson = new Gson().newBuilder().disableHtmlEscaping().create();
        return gson;
    }


    /**
     * 对象序列化为json字符串
     *
     * @param obj
     * @return
     */
    public String toJson(Object obj) {
        return mGson.toJson(obj);
    }


    /**
     * json字符串反序列化为对象
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public <T> T fromJson(String json, Class<T> cls) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json, cls);
    }

    /**
     * json字符串反序列化为对象
     *
     * @param json
     * @param cls
     * @param <T>
     * @return
     */
    public <T> T fromJson(Object json, Class<T> cls) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json.toString(), cls);
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param typeToken
     * @param <T>
     * @return
     */
    public <T> List<T> fromJsonList(Object json, TypeToken<List<T>> typeToken) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json.toString(), typeToken.getType());
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param typeToken
     * @param <T>
     * @return
     */
    public <T> ArrayList<T> fromJsonArrayList(Object json, TypeToken<ArrayList<T>> typeToken) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json.toString(), typeToken.getType());
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param type
     * @param <T>
     * @return
     */
    public <T> List<T> fromJsonList(Object json, Type type) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json.toString(), type);
    }

    /**
     * json字符串反序列化为对象列表
     *
     * @param json
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> ArrayList<T> fromJsonList(Object json, Class<T> clazz) {
        if (json == null) {
            return null;
        }
        return mGson.fromJson(json.toString(), new TypeToken<ArrayList<T>>() {
        }.getType());
    }

    /**
     * 用来判断json为null
     *
     * @param jsonElement
     * @return
     */
    public static boolean isNonNull(JsonElement jsonElement) {
        return jsonElement != null && !jsonElement.isJsonNull();
    }

    /**
     * 使用字符串创建json对象
     *
     * @param json
     * @return
     */
    public static JsonElement createJsonElement(String json) {
        return new JsonParser().parse(json);
    }

    /**
     * 使用字符串创建json对象
     *
     * @param reader
     * @return
     */
    public static JsonElement createJsonElement(Reader reader) {
        return new JsonParser().parse(reader);
    }

    /**
     * 使用字符串创建json对象
     *
     * @param jsonReader
     * @return
     */
    public static JsonElement createJsonElement(JsonReader jsonReader) {
        return new JsonParser().parse(jsonReader);
    }

}
